package com.tvunetworks.center.device.service;

import com.tvunetworks.center.common.model.vo.TimeLockDeviceMsgVo;
import com.tvunetworks.center.device.model.TimeLockEvent;
import com.tvunetworks.center.device.model.TimeLockMsg;
import com.tvunetworks.center.device.model.dto.TimeLockBody;
import com.tvunetworks.center.device.model.vo.TimeLockDeviceVo;
import com.tvunetworks.center.device.model.vo.TimeLockMsgVO;

import java.util.List;
import java.util.Map;

/**
 * @program: tvucc-aggregator
 * @author lebronchen
 * @create: 2019-03-26 10:30
 **/
public interface TimeLockMsgService {
    /**
     * reportTimeLock到timeLockMsg表中
     * @param eventId       eventId
     * @param mainPeerId    主R
     * @param synPeerIdList 从R/Pack的集合
     * @param peerIdMap     从R和对应的内网IP
     * @param packDependenceRidMap key为pack，value为R
     */
    void reportTimeLockMsg(String eventId, String mainPeerId, List<String> synPeerIdList, Map<String, String> peerIdMap, Map<String, String> packDependenceRidMap);

    /**
     * 同步从R/Pack reportTimeLock到timeLockMsg表中,receiver_status为-1表示没有下发给Receiver
     * @param timeLockMsg   主R的timeLockMsg对象
     * @param synPeerIdList 从R/Pack的集合
     * @param peerIdMap     从R和对应的内网IP
     * @param packDependenceRidMap key为pack，value为R
     */
    void reportSyncDeviceTimeLockMsg(List<String> synPeerIdList, Map<String, String> peerIdMap, TimeLockMsg timeLockMsg, Map<String, String> packDependenceRidMap);

    /**
     * startTimeLock 到timeLockMsg表中
     * @param eventId              eventId
     * @param mainPeerId           主R
     * @param synPeerIdList        从R/Pack的集合
     * @param timeLockMsg          主R的timeLockMsg信息
     * @param peerIdMap            从R和对应的内网IP
     * @param packDependenceRidMap key为pack，value为R
     */
    void startTimeLockMsg(String eventId, String mainPeerId, List<String> synPeerIdList, TimeLockMsgVO timeLockMsg,
                          Map<String, String> peerIdMap, Map<String, String> packDependenceRidMap);

    /**
     * 同步从R/Pack并发送给Receiver/Pack
     * @param synPeerIdList        同步的从R/Pack
     * @param msgVO                主R的msg信息
     * @param peerIdMap            从R对应的内网Ip
     * @param timeLockMsg          主R的TimeLockMsg对象
     * @param packDependenceRidMap key为pack，value为R
     */
    void startSyncDeviceTimeLockMsg(List<String> synPeerIdList, TimeLockMsgVO msgVO, Map<String, String> peerIdMap,
                                    TimeLockMsg timeLockMsg, Map<String, String> packDependenceRidMap);

    /**
     * 停止TimeLock信息
     * @param eventId eventId
     * @param userId userId
     */
    void stopTimeLockMsg(String eventId,String userId);

    /**
     * @param eventId eventId
     * @param peerId peerId
     * @param userId userId
     * @param needSendMsgpipe  如果是 R 发送过来的取消任务，那么不需要在发送 msgpipe 到这个 R
     * @param sendMsgpipe 如果为True，则既需要保存记录，也需要发送给receiver。如果为false，则只需要保存记录而不需要发送receiver
     */
    void stopTimeLockMsg(String eventId, String peerId, boolean needSendMsgpipe,String userId, boolean sendMsgpipe);

    /**
     *
     * @param eventId eventId
     * @return List
     */
    List<TimeLockMsg> listSynchronizingPeerIdsByEventId(String eventId);

    /**
     * 根据eventId获取TimeLockMsg集合
     * @param eventId eventId
     * @return TimeLockMsg集合
     */
    List<TimeLockMsg> listSynchronizingMsgByEventId(String eventId);

    /**
     * 根据eventId获取Start的TimeLockMsg集合
     * @param eventId eventId
     * @return 返回集合
     */
    List<TimeLockDeviceVo> listSynchronizingStartReceiverMsgByEventId(String eventId);

    /**
     * 根据rid，eventId，msgType获取msg对象
     * @param eventId eventId
     * @param rid rid
     * @param msgType msgType
     * @return TimeLockMsg
     */
    TimeLockMsg getTimeLockMsg(String eventId, String rid, String msgType);

    /**
     *
     * @param eventId eventId
     * @param peerIdList peerIdList
     * @param reportSync reportSync
     * @return List
     */
    List<TimeLockMsg> listTimeLockMsg(String eventId, List<String> peerIdList, String reportSync);

    /**
     *
     * @param peerId peerId
     * @param body body
     */
    void reportSyncUpdateStatus(String peerId, TimeLockBody body);

    /**
     * 根据eventId、peerId、msgType查找到TimeLockMsg对象，并修改status和message
     * @param peerId peerId
     * @param eventId eventId
     * @param msgType msgType
     * @param status status
     * @return int
     */
    int updateTimeLockMsgByEventIdAndPeerIdAndStatus(String peerId, String eventId, String msgType, int status);

    /**
     * 根据eventId和peerIdList批量逻辑删除timeLockMsg信息
     * @param peerIdList peerIdList
     * @param eventId eventId
     * @return int
     */
    int batchDeleteByPeerIdsAndEventId(List<String> peerIdList, String eventId);

    /**
     * 根据eventId和peerId逻辑删除start/stop/report记录
     * @param eventId eventId
     * @param peerId peerId
     */
    void logicDeleteMsgByEventIdAndPeerId(String eventId, String peerId);

    /**
     * 根据rid的集合获取正在timeLock的设备信息
     * @param rids rid的集合
     * @return 返回同步r的信息
     */
    List<TimeLockDeviceMsgVo> listSynchronizingReportReceiverMsgByRids(List<String> rids);

    /**
     * 根据eventId/liveRid/msgType获取timeLockMsg对象
     * @param eventId eventId
     * @param rid rid
     * @param msgType msgType
     * @return List
     */
    List<TimeLockMsg> getTimeLockMsgByEventIdAndLiveRid(String eventId, String rid, String msgType);


    /**
     * 根据rid的集合获取正在timeLock的Pack
     * @param rids rid的集合
     * @return 返回同步Pack的信息
     */
    List<TimeLockDeviceMsgVo> listOpenTimeLockPackByRids(List<String> rids);

    /**
     * 将Cc中已删除的timeLockEvent重新发送给Receiver
     * @param eventId timeLockEvent的主键id
     * @param rid receiver的id
     * @return 返回timeLockEvent结果
     */
    TimeLockEvent stopTimeLockMessageSendToReceiver(String eventId, String rid);

    /**
     * 检查R那边是否收到了停止TimeLock指令并且关闭成功
     * @return TimeLockMsg
     */
    List<TimeLockMsg> checkReceiver();

    /**
     * 将已经正常关闭的R,DB中receiverStatus状态值设置为2,表示正常关闭.
     * @param id 主键Id
     */
    void updateReceiverTimeLockStatus(String id);
}
